package modelo.test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import junit.framework.TestCase;
import junit.framework.TestSuite;
import modelo.enemigos.Enemigo;
import modelo.enemigos.Mosca;
import modelo.interfaces.Posicionable;
import modelo.juego.Configuracion;
import modelo.mapa.Casillero;
import modelo.mapa.Mapa;
import modelo.torres.Torre;
import modelo.torres.TorreBlanca;

public class PruebaMapa extends TestCase {

	private Mapa m;

	public void setUp() {
		m = new Mapa(Configuracion.TAMANIO_MAPA);
		m.setCamino();
	}
	public void testPosicionarPosicionable() {
		
		Casillero c = m.GetCasilleroXY(1,1);
		
		Posicionable p = new TorreBlanca(c);
		Enemigo e = new Mosca(m.primeraPosicion());
		m.posicionarPosicionable(m.primeraPosicion(), e);

		Casillero nuevoCasillero = m.GetCasilleroXY(2, 2);

		m.posicionarPosicionable(nuevoCasillero, p);
		assertNotSame(p.getCasillero(), c);

		Collection<Posicionable> col = m.elementosEnRango(c, 0);
		assertSame(col.size(), 0);

		col = m.elementosEnRango(c, 150);
		assertSame(col.size(), 2);

		col = m.elementosEnRango(c, 1);
		assertSame(col.size(), 1);

		// Prueba de enemigosEnRango
		Collection<Enemigo> col2 = m.enemigosEnRango(m.primeraPosicion(), 0);
		assertSame(col2.size(), 1);

		Iterator<Posicionable> it = col.iterator();
		Torre unaTorre = (Torre) it.next();
		assertSame(unaTorre, p);

	}

	public void testRemoverPosicionable() {
	
		Collection<Posicionable> posicionables = new ArrayList<Posicionable>();

		for (int i = 0; i < 10; i++) {
			Casillero c = m.GetCasilleroXY(i, i);
			Posicionable p = new TorreBlanca(c);
			m.posicionarPosicionable(c, p);
			posicionables.add(p);
		}
		assertFalse(posicionables.isEmpty());

		Iterator<Posicionable> it = posicionables.iterator();
		Posicionable nuevo = it.next();
		if (nuevo != null) {
			m.removerPosicionable(nuevo);
		}
		Casillero c = m.GetCasilleroXY(10, 10);
		// Obtengo todos los posicionables en el mapa
		posicionables = m.elementosEnRango(c, 100);

		// Compruebo que se haya eliminado del mapa
		assertFalse(posicionables.contains(nuevo));
	}

	public static TestSuite suite() {
		TestSuite suite = new TestSuite();
		suite.addTestSuite(PruebaMapa.class);
		return suite;
	}
}
